/*Copyright (C) 2009 - 2011 MASSART GAUTHIER and Careil Baptiste

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

#ifdef WIN32
# include <process.h>
# undef execv
# define __execv execv
#else
# include <unistd.h>
#endif

#include "../headers.h"

const char *CONTENU_TITRE_OPTIONS = "OPTIONS";

void afficher_onglets(const char *noms_onglets, short onglet_courant) {
	short i, j, x = 4, y = 5;
	char **onglet = split("\n", noms_onglets);

	for(i = 0; onglet[i] != NULL; i++) {

		if(onglet_courant != i + 1) {
			CSLP_Color(COLOR_WHITE , COLOR_BLACK);
		}
		else {
			CSLP_Color(COLOR_WHITE, CBS);
		}

		mvaddstr(y, x, "┌");
		x++;
		for(j = 0; j != (strlen_utf8(onglet[i]) + 2); j++) {
			mvaddstr(y, x, "─");
			x++;
		}
		mvaddstr(y, x, "┐");
		x -= strlen_utf8(onglet[i]) + 3;
		y++;
		mvaddstr(y, x, "│");

		if(onglet_courant == i + 1) {
			CSLP_Color(CTS , CBS);
		}

		printw(" %s ", onglet[i]);

		if(onglet_courant != i + 1) {
			CSLP_Color(COLOR_WHITE , COLOR_BLACK);
			addstr("│");
			CSLP_Color(COLOR_WHITE , CBS);
			y++;
			mvaddstr(y, x, "┴");
			x++;
			for(j = 0; j != (strlen_utf8(onglet[i]) + 2); j++) {
				mvaddstr(y, x, "─");
				x++;
			}
			mvaddstr(y, x, "┴");
		}
		else {
			CSLP_Color(COLOR_WHITE , CBS);
			addstr("│");
			y++;
			mvaddstr(y, x, "┘");
			x++;
			for(j = 0; j != (strlen_utf8(onglet[i]) + 2); j++) {
				mvaddch(y, x, ' ');
				x++;
			}
			mvaddstr(y, x, "└");
		}

		x += 2;
		y -= 2;
	}
}

void afficher_cadre(short x_min, short x_max, short y_min, short y_max, short info_legende) {
	short x = 3, y = 7, i = 0;

	for(y = y_min; y != y_max; y++) {
		for(x = x_min; x != x_max; x++) {
			CSLP_Color(COLOR_WHITE, CBS);
			if(y == y_min && x == x_min) {
				mvaddstr(y, x, "┌");
			}
			else if(y == y_min && x == x_max - 1) {
				mvaddstr(y, x, "┐");
			}
			else if(y == y_max - 1 && x == x_min) {
				mvaddstr(y, x, "└");
			}
			else if(y == y_max - 1 && x == x_max - 1) {
				mvaddstr(y, x, "┘");
			}
			else if(y == y_max - 1 || y == y_min) {
				mvaddstr(y, x, "─");
			}
			else if(x == x_min || x == x_max - 1) {
				mvaddstr(y, x, "│");
			}
			else {
				CSLP_Color(COLOR_WHITE, COLOR_BLACK);
				mvaddch(y, x, ' ');
			}
		}
	}

	move(3, 0);
	if(info_legende) {
		CSLP_Color(COLOR_CYAN, COLOR_YELLOW);
		save_cursor_pos();

		while(i != DEFAULT_SCREEN_SIZE_X) {
			addch(' ');
			i++;
		}

		restore_cursor_pos();
		afficher_centre("│ Onglets ←/→ : TAB + SHIFT/TAB ││ Choix ↑/↓ : touches haut/bas ││ Modifier options : touches droite/gauche ou autres  │");
		CSLP_Color(COLOR_WHITE, COLOR_BLACK);
	}
}

void afficher_fleches_options(short y, short choix) {

	CSLP_Color(COLOR_WHITE, COLOR_BLACK);
	mvaddstr(y + 2 * (choix - 2), 5, "    ");
	mvaddstr(y + 2 * (choix - 2), DEFAULT_SCREEN_SIZE_X - 8, "    ");
	mvaddstr(y + 2 * (choix - 1), 5, "───►");
	mvaddstr(y + 2 * (choix - 1), DEFAULT_SCREEN_SIZE_X - 8, "◄───");
	mvaddstr(y + 2 * (choix), 5, "    ");
	mvaddstr(y + 2 * (choix), DEFAULT_SCREEN_SIZE_X - 8, "    ");

}

short menu_option(const char *noms_onglets, short onglet_courant, short choix, short k, short *nombre_choix) {
	short x = 10, y = 10;

	afficher_fleches_options(y, choix);

	if(onglet_courant == 1) { //Onglet "General"
		char nouveau_mot[50];

		memset(nouveau_mot, 0, sizeof(nouveau_mot));

		mvaddstr(y, x, "Gestion des données");
		editer_chaine(x, y + 2, 0, "Editer nom joueur :                ", prenom);
		editer_chaine(x, y + 4, 0, "Nouveau mot pour le dictionnaire : ", nouveau_mot);
		mvaddstr(y + 6, x, "Configurer les mises à jour");
		mvaddstr(y + 8, x, "Nous contacter");
		mvaddstr(y + 10, x, "Revenir au menu principal sans sauvegarder les modifications");
		mvaddstr(y + 12, x, "Revenir au menu principal  et  sauvegarder les modifications");
		*nombre_choix = 7;

		if(choix == 1) {
			option_gestion_donnees(x, y, k);
			afficher_onglets(noms_onglets, onglet_courant);
		}
		else if(choix == 2) {
			editer_chaine(x, y + 2, k, "Editer nom joueur :                ", prenom);
		}
		else if(choix == 3) {
			ajouter_mot(x, y + 4, k, nouveau_mot);
		}
		else if(choix == 4) {
			option_mise_a_jour(x, y + 6, k);
		}
		else if(choix == 5) {
			option_contacter(x, y + 8, k);
		}
		else if(choix == 6) {
			CSLP_Color(CTS, CBS);
			mvaddstr(y + 10, x, "Revenir au menu principal sans sauvegarder les modifications");
			CSLP_Color(COLOR_WHITE, COLOR_BLACK);
			if(k == KEY_RETURN) {
				return 1;
			}
		}
		else if(choix == 7) {
			CSLP_Color(CTS, CBS);
			mvaddstr(y + 12, x, "Revenir au menu principal  et  sauvegarder les modifications");
			CSLP_Color(COLOR_WHITE, COLOR_BLACK);
			if(k == KEY_RETURN) {
				return 2;
			}
		}
	}
	else if(onglet_courant == 2) { // Onglet "Affichage"
		changer_couleur(x, y, 0, "Couleur du texte :                 ", &CT);
		changer_couleur(x, y + 2, 0, "Couleur de saisie :                ", &CS);
		changer_couleur(x, y + 4, 0, "Couleur du texte de sélection :    ", &CTS);
		changer_couleur(x, y + 6, 0, "Couleur du fond de sélection :     ", &CBS);
		changer_type_menu(x, y + 8, 0);
		switch_choix(x, y + 10, 0, "Animation des menus :              ", &animation_menu);
		switch_choix(x, y + 12, 0, "Animations du lancement et de fin :", &animations_bienvenue_fin);
		mvaddstr(y + 14, x, "Réinitialiser les modifications");
		*nombre_choix = 8;

		if(choix == 1) {
			changer_couleur(x, y, k, "Couleur du texte :                 ", &CT);
		}
		else if(choix == 2) {
			changer_couleur(x, y + 2, k, "Couleur de saisie :                ", &CS);
		}
		else if(choix == 3) {
			changer_couleur(x, y + 4, k, "Couleur du texte de sélection :    ", &CTS);
		}
		else if(choix == 4) {
			changer_couleur(x, y + 6, k, "Couleur du fond de sélection :     ", &CBS);
		}
		else if(choix == 5) {
			changer_type_menu(x, y + 8, k);
		}
		else if(choix == 6) {
			switch_choix(x, y + 10, k, "Animation des menus :              ", &animation_menu);
		}
		else if(choix == 7) {
			switch_choix(x, y + 12, k, "Animations du lancement et de fin :", &animations_bienvenue_fin);
		}
		else if(choix == 8) {
			CSLP_Color(CTS, CBS);
			mvaddstr(y + 14, x, "Réinitialiser les modifications");
			CSLP_Color(COLOR_WHITE, COLOR_BLACK);
			if(k == KEY_RETURN) {
				CT = COLOR_CYAN, CS = COLOR_RED, CTS = COLOR_GREEN, CBS = COLOR_BLUE;
				animation_menu = true, animations_bienvenue_fin = true;
			}
		}
	}
	else if(onglet_courant == 3) { // Onglet "Audio"
		bool stop_musique = is_music_stoped(), musique_aleatoire = music_get_mode_shuffle();
		int ancien_volume;

		ChangeBool(&stop_musique);
		afficher_barre_option(x, y, 0, "Volume actuel de la musique :      ", 0, 125, 5, &volume_musique);
		afficher_barre_option(x, y + 2, 0, "Volume actuel des sons :           ", 0, 125, 5, &volume_son);
		switch_choix(x, y + 4, 0, "Musique :                          ", &stop_musique);
		switch_choix(x, y + 6, 0, "Lire les musiques aléatoirement :  ", &musique_aleatoire);
		mvaddstr(y + 8, x, "Jouer la musique suivante");
		*nombre_choix = 5;

		if(choix == 1) {
			afficher_barre_option(x, y, k, "Volume actuel de la musique :      ", 0, 125, 5, &volume_musique);
		}
		else if(choix == 2) {
			ancien_volume = volume_son;
			afficher_barre_option(x, y + 2, k, "Volume actuel des sons :           ", 0, 125, 5, &volume_son);
			if(ancien_volume != volume_son) {
				jouer_son(DING);
				CSLP_Sleep(200);
			}
		}
		else if(choix == 3) {
			switch_choix(x, y + 4, k, "Musique :                          ", &stop_musique);
			if(stop_musique) {
				stop_music(false);
			}
			else {
				stop_music(true);
			}
		}
		else if(choix == 4) {
			switch_choix(x, y + 6, k, "Lire les musiques aléatoirement :  ", &musique_aleatoire);
			if(musique_aleatoire) {
				music_set_mode_shuffle(true);
			}
			else {
				music_set_mode_shuffle(false);
			}
		}
		else if(choix == 5) {
			CSLP_Color(CTS, CBS);
			mvaddstr(y + 8, x, "Jouer la musique suivante");
			CSLP_Color(COLOR_WHITE, COLOR_BLACK);
			if(k == KEY_RETURN) {
				next_music();
			}
		}
	}
	else if(onglet_courant == 4) { //Onglet "Contrôles"
		changer_touches_directionnelles(x, y, 0, "Touche haut :                      ", &touche_haut);
		changer_touches_directionnelles(x, y + 2, 0, "Touche bas :                       ", &touche_bas);
		changer_touches_directionnelles(x, y + 4, 0, "Touche droite :                    ", &touche_droite);
		changer_touches_directionnelles(x, y + 6, 0, "Touche gauche :                    ", &touche_gauche);
		*nombre_choix = 4;

		if(choix == 1) {
			changer_touches_directionnelles(x, y, k, "Touche haut :                      ", &touche_haut);
		}
		else if(choix == 2) {
			changer_touches_directionnelles(x, y + 2, k, "Touche bas :                       ", &touche_bas);
		}
		else if(choix == 3) {
			changer_touches_directionnelles(x, y + 4, k, "Touche droite :                    ", &touche_droite);
		}
		else if(choix == 4) {
			changer_touches_directionnelles(x, y + 6, k, "Touche gauche :                    ", &touche_gauche);
		}
	}

	if(k != -1) {
		actualiser_barre_son();
		afficher_cadre(3, DEFAULT_SCREEN_SIZE_X - 2, 7, 39, 1);
		afficher_onglets(noms_onglets, onglet_courant);
		menu_option(noms_onglets, onglet_courant, choix, -1, nombre_choix); //Actualise le menu au cas où les couleurs auraient changées

	}
	return 0;
}

void options() {
	char *noms_onglets = "Genéral\nAffichage\nAudio\nContrôles\n";
	short k = 0, choix = 1, nombre_choix, quitter = 0, onglet_courant = 1, nombre_onglets = count_word(noms_onglets, 0, "\n");
	bool premier_tour = true;
	clear();
	afficher_titre(CONTENU_TITRE_OPTIONS);
	afficher_cadre(3, DEFAULT_SCREEN_SIZE_X - 2, 7, 39, 1);
	afficher_onglets(noms_onglets, onglet_courant);

	while(quitter == 0) {

		if(!premier_tour) //Permet l'affichage des options
			k = getch();
		else
			premier_tour = false;

		if(k == 9) { // 9 = Tab
			if(nombre_onglets > onglet_courant) {
				onglet_courant++;
			}
			else { // Si c'est la fin, on revient au début
				onglet_courant = 1;
			}
			choix = 1;
			afficher_cadre(3, DEFAULT_SCREEN_SIZE_X - 2, 7, 39, 1);
			afficher_onglets(noms_onglets, onglet_courant);
			menu_option(noms_onglets, onglet_courant, choix, k, &nombre_choix);
		}
		if(k == M_KEY_BACKTAB) {
			if(1 < onglet_courant) {
				onglet_courant--;
			}
			else { // Si c'est le début, on va à la fin
				onglet_courant = nombre_onglets;
			}
			choix = 1;
			afficher_cadre(3, DEFAULT_SCREEN_SIZE_X - 2, 7, 39, 1);
			afficher_onglets(noms_onglets, onglet_courant);
			menu_option(noms_onglets, onglet_courant, choix, k, &nombre_choix);
		}
		if(k == touche_haut && choix > 1) {
			choix--;
		}
		else if(k == touche_bas && choix < nombre_choix) {
			choix++;
		}

		quitter = menu_option(noms_onglets, onglet_courant, choix, k, &nombre_choix);

	}

	if(quitter == 1) {
		lire_conf();
	}
	else if(quitter == 2) {
		modif_conf();
	}
}

void changer_couleur(short x, short y, short k, const char *info_choix, short *couleur) {
	short couleur_actuel;
	mvaddstr(y, x, info_choix);

	if(k == touche_droite && *couleur < 7) {
		*couleur += 1;
	}
	if(k == touche_gauche && *couleur > 0) {
		*couleur -= 1;
	}

	for(couleur_actuel = 0; couleur_actuel < 8; couleur_actuel++) {
		CSLP_ColorText(couleur_actuel);
		if(*couleur == couleur_actuel) {
			addstr("[");
			afficher_char_fullblock(3, couleur_actuel);
			addstr("]");
		}
		else {
			addstr(" ▒▒▒ ");
		}
	}
}

void changer_type_menu(short x, short y, short k) {
	mvaddstr(y, x, "Type de menu :                     ");

	if(k == touche_droite && type_menu < 2) {
		type_menu++;
	}
	if(k == touche_gauche && type_menu > 1) {
		type_menu--;
	}

	if(type_menu == 1) {
		CSLP_ColorText(COLOR_BLACK);
		addstr("←");
		CSLP_ColorText(CT);
		addstr("Menu à chiffre");
		CSLP_ColorText(COLOR_WHITE);
		addstr("→");
	}
	else if(type_menu == 2) {
		CSLP_ColorText(COLOR_WHITE);
		addstr("←");
		CSLP_ColorText(CT);
		addstr("Menu à flèche");
		CSLP_ColorText(COLOR_BLACK);
		addstr("→ ");
	}
	else {
		CSLP_ColorText(COLOR_RED);
		addstr("ERREUR");
	}
	CSLP_ColorText(COLOR_WHITE);
}

void switch_choix(short x, short y, short k, const char *info_choix, bool *option) {
	mvaddstr(y, x, info_choix);

	if(k == touche_droite && *option == true) {
		*option = false;
	}
	if(k == touche_gauche && *option == false) {
		*option = true;
	}

	if(*option) {
		CSLP_Color(CTS, CBS);
		addstr("[Oui]");
		CSLP_Color(COLOR_WHITE, COLOR_BLACK);
		addstr("     Non ");
	}
	else {
		CSLP_ColorText(COLOR_WHITE);
		addstr(" Oui     ");
		CSLP_Color(CTS, CBS);
		addstr("[Non]");
	}

	CSLP_Color(COLOR_WHITE, COLOR_BLACK);
}

void afficher_barre_option(short x, short y, short k, const char *info_choix, short debut, short fin, short saut, short *variable) {
	short i;
	mvaddstr(y, x, info_choix);

	if(k == KEY_RIGHT && *variable != fin) {
		*variable += saut;
	}
	else if(k == KEY_LEFT && *variable > debut) {
		*variable -= saut;
	}

	addstr("[-] ");

	for(i = debut; i <= fin; i += saut) {
		if(i != *variable) {
			addstr("_");
		}
		else {
			addstr("▲");
		}
	}

	addstr(" [+]");

	CSLP_ColorText(COLOR_RED);
	printw(" %li ", *variable);

	CSLP_ColorText(COLOR_WHITE);
}

void changer_touches_directionnelles(short x, short y, short k, const char *info_choix, short *touche) {
	mvaddstr(y, x, info_choix);
	CSLP_ColorText(COLOR_RED);
	afficher_touche(*touche);
	CSLP_ColorText(COLOR_WHITE);
	if(k == KEY_RETURN) {
		k = 0;
		move(y, x + 35);
		CSLP_Color(CTS, CBS);
		afficher_touche(*touche);
		while(k != KEY_RETURN) {
			*touche = k;
			move(y, x + 35);
			CSLP_Color(CTS, CBS);
			afficher_touche(*touche);
			k = getch();
		}
	}
	CSLP_Color(COLOR_WHITE, COLOR_BLACK);
}

void editer_chaine(short x, short y, short k, const char *info_choix, char *chaine) {
	mvaddstr(y, x, info_choix);
	CSLP_ColorText(COLOR_RED);
	addstr(chaine);
	CSLP_ColorText(COLOR_WHITE);
	if(k == KEY_RETURN) {
		k = 0;
		mvaddstr(y, x, info_choix);
		CSLP_Color(CTS, CBS);
		raw_read(chaine, strlen(chaine), 50, isprint, 0);
	}
	CSLP_Color(COLOR_WHITE, COLOR_BLACK);
}

void option_contacter(short x, short y, short k) {
	CSLP_Color(CTS, CBS);
	mvaddstr(y, x, "Nous contacter");

	if(k == KEY_RETURN) {
		afficher_cadre(3, DEFAULT_SCREEN_SIZE_X - 2, 7, 39, 1);
		CSLP_Color(COLOR_WHITE, COLOR_BLACK);
		move(20, 0);
#ifdef WIN32
		afficher_centre("Une page internet va se charger, merci de patienter un court instant...");
		refresh();
		system("start http://les-jeux-indemodables.servhome.org/");
#else
		CSLP_ColorText(CT);
		afficher_centre("Vous pouvez nous contacter à partir des sites/forums suivant:");
		afficher_centre("Site officiel: http://les-jeux-indemodables.servhome.org/");
		afficher_centre("Site du zero: http://www.siteduzero.com/forum-83-381651-c-console-tous-les-jeux-indemodables-enfin-disponibles.html");
		afficher_centre("Appuyer sur une touche pour continuer...");
		getch();
#endif
		afficher_cadre(3, DEFAULT_SCREEN_SIZE_X - 2, 7, 39, 1);
	}
	CSLP_Color(COLOR_WHITE, COLOR_BLACK);
}

void ajouter_mot(short x, short y, short k, char *nouveau_mot) {
	char caractereActuel = 0;
	short i = 0;

	editer_chaine(x, y, k, "Nouveau mot pour le dictionnaire : ", nouveau_mot);

	if(nouveau_mot[0] != '\0') {
		if(fichier_existe("dico.ini")) {
			do {
				caractereActuel = nouveau_mot[i];
				nouveau_mot[i] = toupper(caractereActuel);
				i++;
			}
			while(caractereActuel != '\0');

			if(pendu_rechercher_mot(nouveau_mot)) {
				printw(" Le mot %s est déjà présent !", nouveau_mot);
			}
			else {
				ini_putl("MOTS", nouveau_mot, 0, "dico.ini");
				printw(" Le mot %s a bien été ajouté.", nouveau_mot);
			}
		}
		else {
			addstr(" Impossible d'ouvrir le fichier dico.txt");
		}
		refresh();
		CSLP_Sleep(1500);
		mvaddstr(y, x, "Nouveau mot pour le dictionnaire :\t\t\t\t\t\t");
	}
}

void option_gestion_donnees(short x, short y, short k) {
	short choix = 0;

	CSLP_Color(CTS, CBS);
	mvaddstr(y, x, "Gestion des données");
	CSLP_Color(COLOR_WHITE, COLOR_BLACK);

	if(k == KEY_RETURN) {
		while(choix < 7) {
			clear();
			choix = afficher_menu_jeu("Effacer les configurations\n"
																"Effacer les scores du plus ou moins\n"
																"Effacer les scores du pendu\n"
																"Effacer les scores du snake\n"
																"Effacer les scores du tetris\n"
																"Tout effacer /!\\ TOUTES LES SAUVEGARDES SERONT PERDUES ! /!\\\n"
																"Revenir aux options\n",
																CONTENU_TITRE_OPTIONS);
			clear();
			afficher_titre(CONTENU_TITRE_OPTIONS);
			afficher_cadre(3, DEFAULT_SCREEN_SIZE_X - 2, 7, 39, 1);
			CSLP_ColorText(CT);
			move(20, 0);

			if(choix == 1) {
				remove(CONFIG_FILENAME);
				afficher_centre(" Les configurations ont été effacés !");
			}
			else if(choix == 2) {
				lire_suppr_score("PlusOuMoinsPN", false);
				lire_suppr_score("PlusOuMoinsPAC", false);
				lire_suppr_score("PlusOuMoinsMA", false);
				afficher_centre(" Les scores ont été effacés !");
			}
			else if(choix == 3) {
				lire_suppr_score("Pendu", false);
				afficher_centre(" Les scores ont été effacés !");
			}
			else if(choix == 4) {
				lire_suppr_score("Snake", false);
				afficher_centre(" Les scores ont été effacés !");
			}
			else if(choix == 5) {
				lire_suppr_score("Tetris", false);
				afficher_centre(" Les scores ont été effacés !");
			}
			else if(choix == 6) {
				lire_suppr_score("PlusOuMoinsPN", false);
				lire_suppr_score("PlusOuMoinsPAC", false);
				lire_suppr_score("PlusOuMoinsMA", false);
				afficher_centre(" Les scores du plus ou moins ont été effacés!");
				lire_suppr_score("Pendu", false);
				afficher_centre(" Les scores du pendu ont été effacés!");
				lire_suppr_score("Snake", false);
				afficher_centre(" Les scores du snake ont été effacés!");
				lire_suppr_score("Tetris", false);
				afficher_centre(" Les scores du tetris ont été effacés!");
			}

			if(choix != 7) {
				afficher_temps('m', 'm', 1, 2000);
			}
		}
	}
	CSLP_Color(COLOR_WHITE, COLOR_BLACK);
}
